package pkg

import (
	"crypto/md5"
	"encoding/json"
	"fmt"
	"hxzkx/global/model"
	"io/ioutil"
	"net/http"
	"net/url"
	"strconv"
	"strings"
	"time"
)

func calculateSN(queryStr string, sk string) string {
	str := queryStr + sk
	key := md5.Sum([]byte(str))
	sn := fmt.Sprintf("%x", key)
	return sn
}

func GetWay(form, seed string) (model.BaiDuGetWay, error) {
	// 此处填写您在控制台-应用管理-创建应用后获取的AK
	ak := model.Conf.BaiDuMap.AppKey

	// 此处填写您在控制台-应用管理-创建应用时，校验方式选择sn校验后生成的SK
	sk := model.Conf.BaiDuMap.SN

	// 服务地址
	host := "https://api.map.baidu.com"

	// 接口地址
	uri := "/direction/v2/driving"
	timestamp := strconv.FormatInt(time.Now().Unix(), 10)
	// 设置请求参数
	params := [][]string{
		{"origin", form},
		{"destination", seed},
		{"ak", ak},
		{"timestamp", timestamp},
		{"alternatives", model.Conf.BaiDuMap.Alternatives},
	}

	paramsArr := make([]string, 0)
	for _, v := range params {
		kv := v[0] + "=" + (v[1])
		paramsArr = append(paramsArr, kv)
	}
	paramsStr := strings.Join(paramsArr, "&")

	// 计算sn
	queryStr := url.QueryEscape(uri + "?" + paramsStr)
	sn := calculateSN(queryStr, sk)

	// 发起请求
	request, err := url.Parse(host + uri + "?" + paramsStr + "&sn=" + sn)
	if nil != err {
		fmt.Printf("host error: %v", err)
		return model.BaiDuGetWay{}, err
	}

	resp, err1 := http.Get(request.String())
	// 请注意，此处打印的url为非urlencode后的请求串
	// 如果将该请求串直接粘贴到浏览器中发起请求，由于浏览器会自动进行urlencode，会导致返回sn校验失败
	fmt.Printf("url: %s\n", request.String())
	defer resp.Body.Close()
	if err1 != nil {
		fmt.Printf("request error: %v", err1)
		return model.BaiDuGetWay{}, err1
	}
	body, err2 := ioutil.ReadAll(resp.Body)
	if err2 != nil {
		fmt.Printf("response error: %v", err2)
	}

	fmt.Println(string(body))
	var result model.BaiDuGetWay
	json.Unmarshal(body, &result)
	return result, nil
}
func GetAddress(name, location string) (model.GetAddressData, error) {
	// 此处填写您在控制台-应用管理-创建应用后获取的AK
	ak := model.Conf.BaiDuMap.AppKey

	// 此处填写您在控制台-应用管理-创建应用时，校验方式选择sn校验后生成的SK
	sk := model.Conf.BaiDuMap.SN

	// 服务地址
	host := "https://api.map.baidu.com"

	// 接口地址
	uri := "/place/v2/search"

	// 设置请求参数
	params := [][]string{
		{"query", name},
		{"location", location},
		{"radius", "0"},
		{"output", "json"},
		{"ak", ak},
	}

	paramsArr := make([]string, 0)
	for _, v := range params {
		kv := v[0] + "=" + (v[1])
		paramsArr = append(paramsArr, kv)
	}
	paramsStr := strings.Join(paramsArr, "&")

	// 计算sn
	queryStr := url.QueryEscape(uri + "?" + paramsStr)
	sn := calculateSN(queryStr, sk)

	// 发起请求
	request, err := url.Parse(host + uri + "?" + paramsStr + "&sn=" + sn)
	if nil != err {
		fmt.Printf("host error: %v", err)
		return model.GetAddressData{}, err
	}

	resp, err1 := http.Get(request.String())
	// 请注意，此处打印的url为非urlencode后的请求串
	// 如果将该请求串直接粘贴到浏览器中发起请求，由于浏览器会自动进行urlencode，会导致返回sn校验失败
	fmt.Printf("url: %s\n", request.String())
	defer resp.Body.Close()
	if err1 != nil {
		fmt.Printf("request error: %v", err1)
		return model.GetAddressData{}, err1
	}
	body, err2 := ioutil.ReadAll(resp.Body)
	if err2 != nil {
		fmt.Printf("response error: %v", err2)
	}

	fmt.Println(string(body))
	var result model.GetAddressData
	json.Unmarshal(body, &result)
	return result, nil
}

func GetAddressByIP(ip string) (model.GetAddressById, error) {
	// 此处填写您在控制台-应用管理-创建应用后获取的AK
	ak := model.Conf.BaiDuMap.AppKey

	// 此处填写您在控制台-应用管理-创建应用时，校验方式选择sn校验后生成的SK
	sk := model.Conf.BaiDuMap.SN

	// 服务地址
	host := "https://api.map.baidu.com"

	// 接口地址
	uri := "/location/ip"

	// 设置请求参数
	params := [][]string{
		{"ip", ip},
		{"coor", "bd09ll"},
		{"ak", ak},
	}

	paramsArr := make([]string, 0)
	for _, v := range params {
		kv := v[0] + "=" + (v[1])
		paramsArr = append(paramsArr, kv)
	}
	paramsStr := strings.Join(paramsArr, "&")

	// 计算sn
	queryStr := url.QueryEscape(uri + "?" + paramsStr)
	sn := calculateSN(queryStr, sk)

	// 发起请求
	request, err := url.Parse(host + uri + "?" + paramsStr + "&sn=" + sn)
	if nil != err {
		fmt.Printf("host error: %v", err)
		return model.GetAddressById{}, err
	}

	resp, err1 := http.Get(request.String())
	// 请注意，此处打印的url为非urlencode后的请求串
	// 如果将该请求串直接粘贴到浏览器中发起请求，由于浏览器会自动进行urlencode，会导致返回sn校验失败
	fmt.Printf("url: %s\n", request.String())
	defer resp.Body.Close()
	if err1 != nil {
		fmt.Printf("request error: %v", err1)
		return model.GetAddressById{}, err1
	}
	body, err2 := ioutil.ReadAll(resp.Body)
	if err2 != nil {
		fmt.Printf("response error: %v", err2)
	}

	fmt.Println(string(body))
	var result model.GetAddressById
	json.Unmarshal(body, &result)
	return result, nil
}
